package com.copd.mapper;

import com.copd.entity.Patient;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;

@Mapper
public interface PatientMapper {
    /**
     * 根据ID查询患者详细信息
     * @param patientId 患者ID
     * @return 患者详细信息
     */
    Map<String, Object> selectPatientById(int patientId);

    void insertPatient(Patient patient);
    
    List<Patient> selectAllPatients(
        @Param("patientId") Integer patientId,
        @Param("name") String name,
        @Param("hospitalizationNumber") String hospitalizationNumber,
        @Param("department") String department,
        @Param("gender") String gender,
        @Param("userId") Integer userId,
        @Param("offset") int offset,
        @Param("pageSize") int pageSize
    );
    
    long countPatients(
        @Param("name") String name,
        @Param("hospitalizationNumber") String hospitalizationNumber,
        @Param("department") String department,
        @Param("gender") String gender,
        @Param("userId") Integer userId
    );

    // 新增诊断记录
    Integer insertDiagnosisRecord(
        @Param("patientId") Integer patientId,
        @Param("diagnosisItem") String diagnosisItem,
        @Param("diagnosisContent") String diagnosisContent,
        @Param("remarks") String remarks
    );

    // 新增检查项目
    Integer insertExaminationItem(
        @Param("patientId") Integer patientId,
        @Param("examCategory") String examCategory,
        @Param("examItem") String examItem,
        @Param("examResult") String examResult,
        @Param("referenceValue") String referenceValue,
        @Param("remarks") String remarks
    );

    // 新增治疗项目
    Integer insertTreatmentPlan(
        @Param("patientId") Integer patientId,
        @Param("planCategory") String planCategory,
        @Param("treatmentItem") String treatmentItem,
        @Param("specificPlan") String specificPlan,
        @Param("remarks") String remarks
    );

    // 新增出院建议
    Integer insertDischargeAdvice(@Param("patientId") Integer patientId,
                             @Param("adviceCategory") String adviceCategory,
                             @Param("dischargeItem") String dischargeItem,
                             @Param("dischargeContent") String dischargeContent,
                             @Param("remarks") String remarks);

    /**
     * 删除患者基本信息
     * @param patientId 患者ID
     * @return 影响的行数
     */
    int deletePatient(Integer patientId);

    /**
     * 删除患者的诊断记录
     * @param patientId 患者ID
     * @return 影响的行数
     */
    int deleteDiagnosisRecords(Integer patientId);

    /**
     * 删除患者的检查项目
     * @param patientId 患者ID
     * @return 影响的行数
     */
    int deleteExaminationItems(Integer patientId);

    /**
     * 删除患者的治疗计划
     * @param patientId 患者ID
     * @return 影响的行数
     */
    int deleteTreatmentPlans(Integer patientId);

    /**
     * 删除患者的出院建议
     * @param patientId 患者ID
     * @return 影响的行数
     */
    int deleteDischargeAdvices(Integer patientId);

    /**
     * 查询患者诊断记录
     * @param patientId 患者ID
     * @return 诊断记录列表
     */
    List<Map<String, Object>> selectDiagnosisRecords(int patientId);

    /**
     * 查询患者检查项目
     * @param patientId 患者ID
     * @return 检查项目列表
     */
    List<Map<String, Object>> selectExaminationItems(int patientId);

    /**
     * 查询患者治疗计划
     * @param patientId 患者ID
     * @return 治疗计划列表
     */
    List<Map<String, Object>> selectTreatmentPlans(int patientId);

    /**
     * 查询患者出院建议
     * @param patientId 患者ID
     * @return 出院建议列表
     */
    List<Map<String, Object>> selectDischargeRecords(int patientId);

    /**
     * 更新患者基本信息
     */
    int updatePatientInfo(
        @Param("patientId") Integer patientId,
        @Param("name") String name,
        @Param("gender") String gender,
        @Param("age") Integer age,
        @Param("department") String department,
        @Param("hospitalizationNumber") String hospitalizationNumber
    );
    
    /**
     * 更新诊断记录
     */
    int updateDiagnosisRecord(
        @Param("recordId") Integer recordId,
        @Param("diagnosisItem") String diagnosisItem,
        @Param("diagnosisContent") String diagnosisContent,
        @Param("remarks") String remarks
    );
    
    /**
     * 删除特定的诊断记录
     */
    int deleteDiagnosisRecord(@Param("recordId") Integer recordId);
    
    /**
     * 更新检查项目
     */
    int updateExaminationItem(
        @Param("examId") Integer examId,
        @Param("examCategory") String examCategory,
        @Param("examItem") String examItem,
        @Param("examResult") String examResult,
        @Param("referenceValue") String referenceValue,
        @Param("remarks") String remarks
    );
    
    /**
     * 删除特定的检查项目
     */
    int deleteExaminationItem(@Param("examId") Integer examId);
    
    /**
     * 更新治疗方案
     */
    int updateTreatmentPlan(
        @Param("planId") Integer planId,
        @Param("planCategory") String planCategory,
        @Param("treatmentItem") String treatmentItem,
        @Param("specificPlan") String specificPlan,
        @Param("remarks") String remarks
    );
    
    /**
     * 删除特定的治疗方案
     */
    int deleteTreatmentPlan(@Param("planId") Integer planId);
    
    /**
     * 更新出院建议
     */
    int updateDischargeAdvice(
        @Param("dischargeId") Integer dischargeId,
        @Param("adviceCategory") String adviceCategory,
        @Param("dischargeItem") String dischargeItem,
        @Param("dischargeContent") String dischargeContent,
        @Param("remarks") String remarks
    );
    
    /**
     * 删除特定的出院建议
     */
    int deleteDischargeAdvice(@Param("dischargeId") Integer dischargeId);

    /**
     * 获取最后插入的记录ID
     */
    Integer getLastInsertId();
}